package com.bear.atlassianmcp.confluence.mcp.tools;

import com.bear.atlassianmcp.confluence.model.ConfluencePage;
import com.bear.atlassianmcp.confluence.service.ConfluenceService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.chat.model.ToolContext;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * Confluence页面管理MCP工具
 * 提供页面查询、空间页面管理等功能
 */
@Service
public class ConfluencePageTools {

    private static final Logger logger = LoggerFactory.getLogger(ConfluencePageTools.class);

    private final ConfluenceService confluenceService;

    @Autowired
    public ConfluencePageTools(ConfluenceService confluenceService) {
        this.confluenceService = confluenceService;
    }

    /**
     * 获取页面详情
     *
     * @param pageId 页面ID
     * @param context 工具上下文
     * @return 页面详细信息的格式化文本
     */
    @Tool(description = "获取指定Confluence页面的详细信息，包括标题、内容、版本等")
    public String getPage(@ToolParam(description = "页面ID，数字格式，可通过搜索或getSpacePages工具获取") String pageId, ToolContext context) {
        logger.info("MCP Tool: Getting Confluence page {}", pageId);

        try {
            ConfluencePage page = confluenceService.getPage(pageId, context);
            String result = page.toFormattedString();

            logger.info("Successfully retrieved Confluence page {} via MCP", pageId);
            return result;

        } catch (Exception e) {
            logger.error("Failed to get Confluence page {} via MCP: {}", pageId, e.getMessage());
            return "❌ 获取页面详情失败。原因：" + e.getMessage();
        }
    }

    /**
     * 获取空间中的页面列表
     *
     * @param spaceKey 空间键值
     * @param context 工具上下文
     * @return 页面列表的格式化文本
     */
    @Tool(description = "获取指定Confluence空间中的所有页面列表")
    public String getSpacePages(@ToolParam(description = "空间键值，如DEMO、PROJ等，可通过getSpaces工具获取") String spaceKey, ToolContext context) {
        logger.info("MCP Tool: Getting pages for Confluence space {}", spaceKey);

        try {
            List<ConfluencePage> pages = confluenceService.getSpacePages(spaceKey, null, context);
            
            if (pages.isEmpty()) {
                return String.format("📁 空间 %s 中当前没有页面。", spaceKey);
            }
            
            StringBuilder result = new StringBuilder();
            result.append(String.format("📁 空间 %s 的页面列表 (共%d个)：\n\n", spaceKey, pages.size()));
            
            for (int i = 0; i < pages.size(); i++) {
                ConfluencePage page = pages.get(i);
                result.append(String.format("%d. %s\n", i + 1, page.getTitle()));
                result.append(String.format("   🆔 ID: %s\n", page.getId()));
                result.append(String.format("   📊 状态: %s\n", page.getStatus()));
                
                if (page.getVersion() != null) {
                    result.append(String.format("   🔢 版本: %s\n", page.getVersion().getNumber()));
                }
                
                String content = page.getContent();
                if (content != null && !content.trim().isEmpty()) {
                    String preview = content.length() > 100 ? content.substring(0, 100) + "..." : content;
                    result.append(String.format("   📝 内容预览: %s\n", preview));
                }
                
                result.append("\n");
            }
            
            logger.info("Successfully retrieved {} pages for space {} via MCP", pages.size(), spaceKey);
            return result.toString();
            
        } catch (Exception e) {
            logger.error("Failed to get pages for space {} via MCP: {}", spaceKey, e.getMessage());
            return "❌ 获取空间页面列表失败。原因：" + e.getMessage();
        }
    }

    /**
     * 获取空间页面统计
     *
     * @param spaceKey 空间键值
     * @param context 工具上下文
     * @return 页面统计信息
     */
    @Tool(description = "获取指定Confluence空间的页面统计信息，包括页面总数等")
    public String getSpacePageStatistics(String spaceKey, ToolContext context) {
        logger.info("MCP Tool: Getting page statistics for Confluence space {}", spaceKey);

        try {
            List<ConfluencePage> pages = confluenceService.getSpacePages(spaceKey, null, context);
            
            StringBuilder result = new StringBuilder();
            result.append(String.format("📊 空间 %s 的页面统计：\n\n", spaceKey));
            result.append(String.format("📈 页面总数: %d\n", pages.size()));
            
            if (!pages.isEmpty()) {
                result.append("\n🔍 最近的页面:\n");
                int count = Math.min(5, pages.size());
                for (int i = 0; i < count; i++) {
                    ConfluencePage page = pages.get(i);
                    result.append(String.format("• %s (ID: %s)\n", page.getTitle(), page.getId()));
                }
                
                if (pages.size() > count) {
                    result.append(String.format("... 还有 %d 个页面\n", pages.size() - count));
                }
            }
            
            logger.info("Successfully retrieved page statistics for space {} via MCP", spaceKey);
            return result.toString();
            
        } catch (Exception e) {
            logger.error("Failed to get page statistics for space {} via MCP: {}", spaceKey, e.getMessage());
            return "❌ 获取空间页面统计失败。原因：" + e.getMessage();
        }
    }

    /**
     * 创建新页面
     *
     * @param title 页面标题
     * @param content 页面内容（支持HTML或Confluence存储格式）
     * @param spaceKey 空间键值
     * @param parentId 父页面ID（可选，如果不提供则创建为根页面）
     * @param context 工具上下文
     * @return 创建结果的格式化文本
     */
    @Tool(description = "在指定Confluence空间中创建新页面，可以指定父页面创建层级结构")
    public String createPage(@ToolParam(description = "页面标题，必须在空间内唯一") String title,
                            @ToolParam(description = "页面内容，支持HTML格式和Confluence存储格式") String content,
                            @ToolParam(description = "空间键值，如DEMO、PROJ等") String spaceKey,
                            @ToolParam(required = false, description = "父页面ID，可选，不提供则创建为根页面") String parentId,
                            ToolContext context) {
        logger.info("MCP Tool: Creating Confluence page '{}' in space '{}'", title, spaceKey);

        try {
            ConfluencePage page = confluenceService.createPage(title, content, spaceKey, parentId, context);

            StringBuilder result = new StringBuilder();
            result.append("✅ 页面创建成功！\n\n");
            result.append(page.toFormattedString());

            logger.info("Successfully created Confluence page '{}' via MCP", title);
            return result.toString();

        } catch (Exception e) {
            logger.error("Failed to create Confluence page '{}' via MCP: {}", title, e.getMessage());
            return "❌ 创建页面失败。原因：" + e.getMessage() +
                   "\n💡 请检查空间键值是否正确，以及是否有创建页面的权限。";
        }
    }

    /**
     * 更新页面内容
     *
     * @param pageId 页面ID
     * @param title 新标题（可选，如果不想修改标题可以传入原标题）
     * @param content 新内容（支持HTML或Confluence存储格式）
     * @param versionNumber 版本号（必须比当前版本号大1）
     * @param context 工具上下文
     * @return 更新结果的格式化文本
     */
    @Tool(description = "更新指定Confluence页面的标题和内容，需要提供正确的版本号")
    public String updatePage(@ToolParam(description = "页面ID，数字格式") String pageId,
                            @ToolParam(description = "新标题，如果不想修改可以传入原标题") String title,
                            @ToolParam(description = "新内容，支持HTML格式和Confluence存储格式") String content,
                            @ToolParam(description = "版本号，必须比当前版本号大1，可通过getPage获取当前版本") Integer versionNumber,
                            ToolContext context) {
        logger.info("MCP Tool: Updating Confluence page {}", pageId);

        try {
            ConfluencePage page = confluenceService.updatePage(pageId, title, content, versionNumber, context);

            StringBuilder result = new StringBuilder();
            result.append("✅ 页面更新成功！\n\n");
            result.append(page.toFormattedString());

            logger.info("Successfully updated Confluence page {} via MCP", pageId);
            return result.toString();

        } catch (Exception e) {
            logger.error("Failed to update Confluence page {} via MCP: {}", pageId, e.getMessage());
            return "❌ 更新页面失败。原因：" + e.getMessage() +
                   "\n💡 请检查页面ID和版本号是否正确，版本号必须比当前版本大1。";
        }
    }

    /**
     * 删除页面
     *
     * @param pageId 页面ID
     * @param context 工具上下文
     * @return 删除结果的格式化文本
     */
    @Tool(description = "删除指定的Confluence页面，此操作不可逆，请谨慎使用")
    public String deletePage(String pageId, ToolContext context) {
        logger.info("MCP Tool: Deleting Confluence page {}", pageId);

        try {
            String result = confluenceService.deletePage(pageId, context);

            logger.info("Successfully deleted Confluence page {} via MCP", pageId);
            return "✅ " + result + "\n🆔 已删除页面ID: " + pageId;

        } catch (Exception e) {
            logger.error("Failed to delete Confluence page {} via MCP: {}", pageId, e.getMessage());
            return "❌ 删除页面失败。原因：" + e.getMessage() +
                   "\n💡 请检查页面ID是否正确，以及是否有删除页面的权限。";
        }
    }

    /**
     * 获取页面详细内容
     *
     * @param pageId 页面ID
     * @return 页面详细内容的格式化文本
     */
    @Tool(description = "获取指定Confluence页面的完整详细内容，包括完整的页面内容")
    public String getPageContent(String pageId, ToolContext toolContext) {
        logger.info("MCP Tool: Getting detailed content for Confluence page {}", pageId);

        try {
            ConfluencePage page = confluenceService.getPageContent(pageId, toolContext);

            StringBuilder result = new StringBuilder();
            result.append("📄 页面详细内容：\n\n");
            result.append(page.toFormattedString());

            // 添加完整内容
            String content = page.getContent();
            if (content != null && !content.trim().isEmpty()) {
                result.append("\n📝 完整内容：\n");
                result.append("─".repeat(50)).append("\n");
                result.append(content).append("\n");
                result.append("─".repeat(50)).append("\n");
            }

            logger.info("Successfully retrieved detailed content for Confluence page {} via MCP", pageId);
            return result.toString();

        } catch (Exception e) {
            logger.error("Failed to get detailed content for Confluence page {} via MCP: {}", pageId, e.getMessage());
            return "❌ 获取页面详细内容失败。原因：" + e.getMessage();
        }
    }

    /**
     * 根据标题获取页面
     *
     * @param title 页面标题
     * @param spaceKey 空间键值
     * @return 页面信息的格式化文本
     */
    @Tool(description = "根据页面标题和空间键值查找Confluence页面")
    public String getPageByTitle(@ToolParam(description = "页面标题") String title,
                                @ToolParam(description = "空间键值，如DEMO、PROJ等") String spaceKey,
                                ToolContext toolContext) {
        logger.info("MCP Tool: Getting Confluence page by title '{}' in space '{}'", title, spaceKey);

        try {
            ConfluencePage page = confluenceService.getPageByTitle(title, spaceKey, toolContext);
            String result = page.toFormattedString();

            logger.info("Successfully retrieved Confluence page by title '{}' via MCP", title);
            return result;

        } catch (Exception e) {
            logger.error("Failed to get Confluence page by title '{}' via MCP: {}", title, e.getMessage());
            return "❌ 根据标题获取页面失败。原因：" + e.getMessage() +
                   "\n💡 请检查页面标题和空间键值是否正确。";
        }
    }

    /**
     * 获取子页面列表
     *
     * @param pageId 父页面ID
     * @return 子页面列表的格式化文本
     */
    @Tool(description = "获取指定Confluence页面的所有子页面列表")
    public String getChildPages(String pageId, ToolContext toolContext) {
        logger.info("MCP Tool: Getting child pages for Confluence page {}", pageId);

        try {
            List<ConfluencePage> pages = confluenceService.getChildPages(pageId, null, toolContext);

            if (pages.isEmpty()) {
                return String.format("📁 页面 %s 当前没有子页面。", pageId);
            }

            StringBuilder result = new StringBuilder();
            result.append(String.format("📁 页面 %s 的子页面列表 (共%d个)：\n\n", pageId, pages.size()));

            for (int i = 0; i < pages.size(); i++) {
                ConfluencePage page = pages.get(i);
                result.append(String.format("%d. %s\n", i + 1, page.getTitle()));
                result.append(String.format("   🆔 ID: %s\n", page.getId()));
                result.append(String.format("   📊 状态: %s\n", page.getStatus()));

                if (page.getVersion() != null) {
                    result.append(String.format("   🔢 版本: %s\n", page.getVersion().getNumber()));
                }

                String content = page.getContent();
                if (content != null && !content.trim().isEmpty()) {
                    String preview = content.length() > 100 ? content.substring(0, 100) + "..." : content;
                    result.append(String.format("   📝 内容预览: %s\n", preview));
                }

                result.append("\n");
            }

            logger.info("Successfully retrieved {} child pages for page {} via MCP", pages.size(), pageId);
            return result.toString();

        } catch (Exception e) {
            logger.error("Failed to get child pages for page {} via MCP: {}", pageId, e.getMessage());
            return "❌ 获取子页面列表失败。原因：" + e.getMessage();
        }
    }
}
